#ifndef PARALLELTESTTEMPLATE_H_JM_20130205
#define PARALLELTESTTEMPLATE_H_JM_20130205
/// @file ParallelTestTemplate.h Sablona pre skupinu testov tvorenu jednym 
/// testom s roznymi stupnami paralelizacie.

#include "ModelTest.h"
#include <vector>

namespace jm4bbx {
	/**
	 * Automoztizacia vytvarania skupin testov s roznymi urovnami paralelizacie.
	 * Umoznuje vytvarat bud skupinu N testov so stupnom paralelizacie od 1 do N.
	 * Priapdne je mozne vytvarat skupiny testov, kde kazdy test ma presne 
	 * zadanu uroven paralelizacie.
	 * 
	 * @warning Skupina testov nesmie obsahovat dvakrat ten isty test rovnakej 
	 * urovne paralelizacie.
	 * 
	 * @taparm N stupen paralelizacie skupiny - vytvori sa N testov s 
	 * paralelizaciuou 1 az N.
	 * 
	 * @tparam TestType typ testu, ktory musi brat sablonovy parameter urcujuci
	 * stupen paralelizacie.
	 **/
	template<int N, template<int x> class TestType>
	class ParallelTestTemplate {
	public:
		ParallelTestTemplate() {
			addTestFrom<N>();
		}

	protected:
		/// Sada testov v roznyach urovniach paralelizacie.
		std::vector<ModelTest*> tests_;

		/// Pridaj test konkretneho stupna paralelizacie.
		/// @tparam X stupen paralelizacie pridavaneho testu.
		template<int X>
		void addTest() {
			static TestType<X> t;
			tests_.push_back(&t);
		}

		/// Pridanie skupiny testov roznych stupnov paralelizaci od X do 1.
		/// @tparam X horna medza paralelizmu v skupine pridavanaych testov.
		template<int X>
		void addTestFrom() {
			addTestFrom<X - 1>();
			addTest<X>();
		}

	private:

		/// Zastavenie rekurzie pridavanie skupiny testov roznych stupnov 
		/// paralelizacie. 
		/// @see #addTestFrom()
		template<>
		void addTestFrom<1>() {
			addTest<1>();
		}


	};	
} // namespace jm4bbx

#endif
